import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
import tensorflow as tf

class Daima5(object):
    
    def __init__(self):
        # 读取 scenic_data.csv 文件数据，初始化 df 属性
        self.df = pd.read_csv("dD:/数据挖掘代码/git第一个项目/seven/scenic_data.csv")  

    def creat_dataset(self, df, n_steps):
        X, y = [], []
        # 根据步长 n_steps 遍历数据，构建输入特征 X 和目标值 y
        for i in range(len(df) - n_steps):  
            x_values = df[i: i + n_steps]  
            x_values = pd.DataFrame(x_values)  
            # 将 x_values 最后一列（count 列对应位置）置 0
            x_values.iloc[-1, x_values.columns.get_loc('count')] = 0  
            X.append(x_values)  
            # 取对应目标值（count 列中对应位置的值）
            y.append(df['count'][i + n_steps - 1])  
        # 将 X 和 y 转换为 numpy 数组返回
        return np.array(X), np.array(y)  

    def get_model(self):
        # 设置步长为 7 天
        n_steps = 7  
        # 获取特征矩阵 X 和目标值数组 y
        X, y = self.creat_dataset(self.df, n_steps)  

        # 划分训练集和测试集，训练集占比 0.8
        train_size = int(len(X) * 0.8)  
        X_train, X_test = X[:train_size], X[train_size:]  
        y_train, y_test = y[:train_size], y[train_size:]  

        # 构建 Sequential 模型
        model = tf.keras.models.Sequential()  
        # 添加 LSTM 层，60 个单元，relu 激活函数，返回序列，指定输入形状
        model.add(tf.keras.layers.LSTM(60, activation='relu', return_sequences=True, input_shape=(n_steps, X_train.shape[2])))  
        # 添加 LSTM 层，60 个单元，relu 激活函数
        model.add(tf.keras.layers.LSTM(60, activation='relu'))  
        # 添加全连接层，输出维度 1
        model.add(tf.keras.layers.Dense(1))  
        # 编译模型，优化器为 adam，损失函数为 mse（均方误差）
        model.compile(optimizer='adam', loss='mse')  
        # 训练模型，50 个轮次，用测试集做验证数据
        model.fit(X_train, y_train, epochs=50, validation_data=(X_test, y_test))  

        # 评估模型，在测试集上计算损失
        loss = model.evaluate(X_test, y_test)  
        # 打印测试集损失
        print(f"model.evaluate(X_test, y_test) 测试集损失: {loss}")  
        # 保存模型到 'NN/my_model.keras' 文件
        tf.keras.models.save_model(model, 'D:/数据挖掘代码/git第一个项目/seven/my_model.keras')

if __name__ == '__main__':
    mwy = Daima5()
    mwy.get_model()